package chatGUI;

import java.awt.Color;
import java.awt.Window;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import chatControler.ChatControler;
import chatModel.Choix;
import chatModel.ModelMsgToGUI;
import chatModel.ModeleEtatGUI;
import chatModel.Utilisateur;
import chatModel.UtilisateurDistant;

/**
 * Classe principale du GUI, centralise tous les éléments du GUI.
 * Cette classe est un observeur de plusieurs modèles
 * 
 */
public class ChatGUI implements Observer {

	private EcranConnexion ecranConnexion;

	private ChatControler chatControler;
	private EcrandeTravail ecranTravail;
	private EcranduChat ecranDuChat;
        
        /**
         * Constructeur du ChatGUI
         * @param chatControler : ChatControler du ChatSystem, à créer impérativement avant d'appeler ce constructeur
         */
	public ChatGUI(ChatControler chatControler) {

		this.chatControler = chatControler;
		this.chatControler.getMsgToGui().addObserver(this);
		this.chatControler.getMdlEtatGui().addObserver(this);
		this.ecranConnexion = new EcranConnexion(chatControler);

	}
        
        /**
         * Selectionne l'onglet d'un utilisateur distant, ajoute des onglets si besoin
         * @param userDistant : utilisateur distant à qui on cherche son onglet
         * @return L'onglet de l'utilisateur distant
         */
	public Onglet selectOnglet(UtilisateurDistant userDistant){
		int i =0;
		boolean trouve = false;
		String nameOtherUser = userDistant.getUserName();
		Onglet bonOnglet=null;
		while( (i< this.ecranTravail.ongletsConversation.getTabCount() && !trouve)){
			if(((Onglet)this.ecranTravail.ongletsConversation.getComponentAt(i)).getNomOnglet().compareTo(nameOtherUser)==0){
				trouve=true;
				bonOnglet=(Onglet)this.ecranTravail.ongletsConversation.getComponentAt(i);
				System.out.println("trouvé onglet !!!");
			}
			i++;
		}
		if(!trouve){
			System.out.println("pas trouvé");
			bonOnglet = new Onglet(userDistant.getUserName());
			this.ecranTravail.ongletsConversation.add(userDistant.getUserName().toString(), bonOnglet);
		}
		return bonOnglet;
	}
	
        /**
         * Méthode redéfinie la classe mère, elle gère les notifications des différents modèles
         * @see chatModel
         * @param observed Modèle observé
         * @param object Objet envoyé lors de la notification (en général le modèle lui même)
         */
	@Override
	public synchronized void update(Observable observed, Object object) {
		System.out.println("update GUI");
		
		if(observed instanceof ModelMsgToGUI){
			ModelMsgToGUI tempUtilisateur = (ModelMsgToGUI) object;
			//Connexion ok
			if(tempUtilisateur.getChoix()==Choix.connexionOk){
				this.ecranConnexion.removeNotify();
				this.ecranConnexion=null;
				this.ecranDuChat = new EcranduChat(tempUtilisateur.getUtilisateurLocal().getUserName(), chatControler);
				this.ecranTravail = this.ecranDuChat.ecranDeTravail;
                this.ecranTravail.notification.append("ChatSystem : Bienvenue\n"+"Si vous souhaitez fermer un onglet faites un clic droit dessus\n");
			}
			
			else if(tempUtilisateur.getChoix()==Choix.connectdeconnect){
				this.ecranTravail.notification.append(tempUtilisateur.getMsgDansFenetre()+"\n");
				this.ecranTravail.notification.setCaretPosition(this.ecranTravail.notification.getDocument().getLength());
			
			}
			// envoie d'un message
			else if(tempUtilisateur.getChoix()==Choix.afficherMsg){
				System.out.println("je rentre dans le if pour le msg");
				Onglet bonOnglet=selectOnglet(tempUtilisateur.getUserDistant());
				bonOnglet.getAireReception().append(tempUtilisateur.getMsgDansFenetre() + "\n");
				bonOnglet.getAireReception().setCaretPosition(bonOnglet.getAireReception().getDocument().getLength());
			}
			//On reçoit un nouveau message
			else if(tempUtilisateur.getChoix()==Choix.rcvMsg){
				Onglet bonOnglet=selectOnglet(tempUtilisateur.getUserDistant());
				bonOnglet.getAireReception().append(tempUtilisateur.getUserDistant().getUserName() + " : " + tempUtilisateur.getMsgDansFenetre() + "\n");
				bonOnglet.getAireReception().setCaretPosition(bonOnglet.getAireReception().getDocument().getLength());
				if(bonOnglet.getNomOnglet().compareTo(((Onglet)this.ecranTravail.ongletsConversation.getSelectedComponent()).getNomOnglet())!=0){
					this.ecranTravail.notification.append("    *** Vous avez reçu un message de " + tempUtilisateur.getUserDistant().getUserName() + " ! ***"+"\n");
					this.ecranTravail.notification.setCaretPosition(this.ecranTravail.notification.getDocument().getLength());
				}
			}
			
			else if((tempUtilisateur.getChoix()==Choix.rcvAcceptedFile)||(tempUtilisateur.getChoix()==Choix.rcvRefusedFile)){
				System.out.println("je vais chercher l'onglet");
				Onglet bonOnglet=selectOnglet(tempUtilisateur.getUserDistant());
				bonOnglet.getAireReception().append(tempUtilisateur.getMsgDansFenetre() + "\n");
				System.out.println("je l'affiche");
			}
			
			else if(tempUtilisateur.getChoix()==Choix.fichierRecuOuEnvoye){
				Onglet bonOnglet=selectOnglet(tempUtilisateur.getUserDistant());
				bonOnglet.getAireReception().append(tempUtilisateur.getMsgDansFenetre()+"\n");
			}
			
			//On reçoit une notification de demande de reception de fichier
			else if(tempUtilisateur.getChoix()==Choix.fileNotif){
				int choice = JOptionPane.showConfirmDialog(this.ecranTravail,
						tempUtilisateur.getUserDistant().getUserName() + " veut vous envoyer le fichier suivant : " + tempUtilisateur.getNameFileProposed() +
						" voulez vous l'accepter ?", "Reception de fichier" ,JOptionPane.YES_NO_OPTION);
				if(choice==JOptionPane.OK_OPTION){
					JFileChooser choix = new JFileChooser();
					choix.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
					int resultat = choix.showOpenDialog(this.ecranTravail);
					if (resultat == JFileChooser.APPROVE_OPTION) {
						this.chatControler.acceptFile(tempUtilisateur.getUserDistant(), tempUtilisateur.getNameFileProposed(), choix.getSelectedFile());
					}
					else{
						this.chatControler.refuseFile(tempUtilisateur.getUserDistant(), tempUtilisateur.getNameFileProposed());
					}
				}
				else if(choice==JOptionPane.NO_OPTION){
					this.chatControler.refuseFile(tempUtilisateur.getUserDistant(), tempUtilisateur.getNameFileProposed());
				}
			}
			
			//On se deconnecte
			else if(tempUtilisateur.getChoix()==Choix.deconnexionOk){
				//this.ecranTravail.removeNotify();
				((Window) this.ecranTravail.getTopLevelAncestor()).dispose();
				this.ecranDuChat=null;
				this.ecranTravail=null;
				this.ecranConnexion = new EcranConnexion(chatControler);
			}
			
		}
		
		if(observed instanceof ModeleEtatGUI){
			ModeleEtatGUI etatActuel = (ModeleEtatGUI) object;
			//Connexion ok
			if(etatActuel.getEtat()==Choix.etatConnected){
				this.ecranTravail.etat=Choix.etatConnected;
				System.out.println("le gui est dans l'état connecté");
			}
			else if(etatActuel.getEtat()==Choix.etatRcvingFile){
				this.ecranTravail.etat=Choix.etatRcvingFile;
				System.out.println("le gui est dans l'état reception");
			}
			else if(etatActuel.getEtat()==Choix.etatSendingFile){
				this.ecranTravail.etat=Choix.etatSendingFile;
				System.out.println("le gui est dans l'état envoie");
			}
		}
	}

}